查看原文
其他

【SFA官方翻译】Spring Boot中配置Tomcat连接池

stphenZkang SpringForAll社区 2020-10-17

原文链接:https://www.baeldung.com/spring-boot-tomcat-connection-pool

作者:baeldung

译者:康仔

1. 简介

Spring Boot是在Spring平台基础上开发的固定且功能强大的抽象层,它使得我们的开发独立,且开发web应用程序成为一件无需动脑筋的事情。Spring Boot提供了一些方便的“启动程序”依赖项,旨在以最小的占用空间运行和测试Java应用程序。

这些启动依赖中一个关键组件是 spring-boot-starter-data-jpa。它允许我们使用JPA并通过使用一些流行的JDBC连接池实现(如HikariCP和Tomcat JDBC连接池)连接数据库。

2. Maven依赖

Spring Boot使用了HikariCP作为默认连接池,这是由于其出色的性能和企业特性。

下面是如何用Spring Boot自动配置连接池数据源:

1.Spring Boot将在classpath上查找HikariCP,如果找到则默认使用它

2.如果在类路径中没有找到HikariCP,那么Spring Boot将获取Tomcat JDBC连接池(如果可用的话)

3.如果这些选项都不可用,Spring Boot将选择Apache Commons DBCP2(如果可用)

为了配置Tomcat JDBC连接池而不使用默认的HikariCP,我们将从spring-boot-starter-data-jpa依赖项中排除HikariCP,并将tomcat-jdbc Maven依赖项添加到我们的pom.xml中:

  1. <dependency>

  2.    <groupId>org.springframework.boot</groupId>

  3.    <artifactId>spring-boot-starter-data-jpa</artifactId>

  4.    <exclusions>

  5.        <exclusion>

  6.            <groupId>com.zaxxer</groupId>

  7.            <artifactId>HikariCP</artifactId>

  8.        </exclusion>

  9.    </exclusions>

  10. </dependency>

  11. <dependency>

  12.    <groupId>org.apache.tomcat</groupId>

  13.    <artifactId>tomcat-jdbc</artifactId>

  14.    <version>9.0.10</version>

  15. </dependency>

  16. <dependency>

  17.    <groupId>com.h2database</groupId>

  18.    <artifactId>h2</artifactId>

  19.    <version>1.4.197</version>

  20.    <scope>runtime</scope>

  21. </dependency>

这种简单的方法允许我们在Spring Boot中使用Tomcat连接池,而无需编写@Configuration注解类并以编程方式定义数据源 的实体。

同样值得注意的是,在本例中,我们使用H2作为内存数据库。 Spring Boot将为我们自动配置H2,而无需指定数据库URL、用户和密码。

我们只需要在“pom.xml”文件中包含相应的依赖关系,Spring Boot将为我们完成其余的工作。

另外,它还可能跳过Spring Boot的连接池扫描算法, 并在application.properties”文件中使用“spring.datasource.type”属性 显式指定连接池数据源:

  1. spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource

  2. // other spring datasource properties

3. 在application.properties中配置连接池参数

一旦我们在Spring Boot中成功地配置了Tomcat连接池,我们很可能会希望设置一些附加属性,以优化其性能并满足某些特定需求。

我们可以在“application.properties”文件中如下配置:

  1. spring.datasource.tomcat.initial-size=15

  2. spring.datasource.tomcat.max-wait=20000

  3. spring.datasource.tomcat.max-active=50

  4. spring.datasource.tomcat.max-idle=15

  5. spring.datasource.tomcat.min-idle=8

  6. spring.datasource.tomcat.default-auto-commit=true

请注意,我们已经配置了一些附加的连接池属性,例如池的初始大小,以及空闲连接的最大值和最小值。

我们还可以指定一些Hibernate特有的属性:

  1. # Hibernate specific properties

  2. spring.jpa.show-sql=false

  3. spring.jpa.hibernate.ddl-auto=update

  4. spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy

  5. spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect

  6. spring.jpa.properties.hibernate.id.new_generator_mappings=false

4. 测试连接池

让我们编写一个简单的集成测试来检查Spring Boot是否正确配置了连接池:

  1. @RunWith(SpringRunner.class)

  2. @SpringBootTest

  3. public class SpringBootTomcatConnectionPoolIntegrationTest {

  4.    @Autowired

  5.    private DataSource dataSource;

  6.    @Test

  7.    public void givenTomcatConnectionPoolInstance_whenCheckedPoolClassName_thenCorrect(){

  8.        assertThat(dataSource.getClass().getName())

  9.          .isEqualTo("org.apache.tomcat.jdbc.pool.DataSource");

  10.    }

  11. }

5. 示例命令行应用程序

连接池管道设置完成后,我们可以构建一个简单的命令行应用程序。

在此过程中,我们可以看到如何使用Spring Data JPA(以及可传递的Spring Boot)提供的功能强大的DAO层且在H2数据库上执行一些CRUD操作。

有关如何使用Spring Data JPA的详细指南,请参阅本文。

5.1. Customer实体类

让我们首先定义一个简单的Customer实体类:

  1. @Entity

  2. @Table(name = "customers")

  3. public class Customer {

  4.    @Id

  5.    @GeneratedValue(strategy = GenerationType.AUTO)

  6.    private long id;

  7.    @Column(name = "first_name")

  8.    private String firstName;

  9.    // standard constructors / getters / setters / toString

  10. }

5.2. CustomerRepository 接口

在本例中,我们只想在 Customer实体上执行CRUD操作。此外,我们需要获取匹配给定姓氏的所有客户。

因此,我们所要做的就是扩展Spring Data JPA的CrudRepository接口,并定义一个定制的方法:

  1. public interface CustomerRepository extends CrudRepository<Customer, Long> {

  2.    List<Customer> findByLastName(String lastName);

  3. }

现在,我们可以很轻松地通过姓氏获取客户实体。

5.3. CommandLineRunner实现类

最后,我们至少需要在数据库中持久化一些Customer实体,并验证Tomcat连接池是否正常工作。

让我们创建一个Spring Boot的CommandLineRunner接口的实现类。Spring Boot将在启动应用程序之前引导实现类:

  1. public class CommandLineCrudRunner implements CommandLineRunner {

  2.    private static final Logger logger = LoggerFactory.getLogger(CommandLineCrudRunner.class);

  3.    @Autowired

  4.    private final CustomerRepository repository;

  5.    public void run(String... args) throws Exception {

  6.        repository.save(new Customer("John", "Doe"));

  7.        repository.save(new Customer("Jennifer", "Wilson"));

  8.        logger.info("Customers found with findAll():");

  9.        repository.findAll().forEach(c -> logger.info(c.toString()));

  10.        logger.info("Customer found with findById(1L):");

  11.        Customer customer = repository.findById(1L)

  12.          .orElseGet(() -> new Customer("Non-existing customer", ""));

  13.        logger.info(customer.toString());

  14.        logger.info("Customer found with findByLastName('Wilson'):");

  15.        repository.findByLastName("Wilson").forEach(c -> {

  16.            logger.info(c.toString());

  17.        });

  18.    }

  19. }

简言之,CommandLineCrudRunner类首先在数据库中保存一对Customer实体。接下来,它使用findById()方法获取第一个。最后,它使用 findByLastName()方法检索客户。

5.4. 运行Spring Boot程序

当然,我们需要做的最后一件事就是运行示例应用程序。然后我们可以看到Spring Boot和Tomcat连接池都在运行:

  1. @SpringBootApplication

  2. public class SpringBootConsoleApplication {

  3.    public static void main(String[] args) {

  4.        SpringApplication.run(SpringBootConsoleApplication.class);

  5.    }

  6. }

6. 结论

在本教程中,我们学习了如何在Spring Boot中配置和使用Tomcat连接池。此外,我们还开发了一个基本的命令行应用程序,以展示使用Spring Boot、Tomcat连接池和H2数据库是多么容易。

和往常一样,本教程中显示的所有代码示例都可以在GitHub上找到。


推荐: 【SFA官方翻译】:Spring中的组件扫描

上一篇:【SFA官方翻译】:Micronaut Mastery:HTTP客户端的特定配置属性使用

关注公众号


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存